// 用户认证和授权端到端测试
describe('用户认证和授权', () => {
  beforeEach(() => {
    cy.clearCookies();
    cy.clearLocalStorage();
  });

  it('应该能够成功登录', () => {
    // 访问登录页面
    cy.visit('/login');
    
    // 验证页面元素
    cy.shouldHavePageTitle('用户登录');
    cy.get('[data-cy="email-input"]').should('be.visible');
    cy.get('[data-cy="password-input"]').should('be.visible');
    cy.get('[data-cy="login-button"]').should('be.visible');
    
    // 输入登录信息
    const userData = cy.getTestData().user;
    cy.get('[data-cy="email-input"]').type(userData.email);
    cy.get('[data-cy="password-input"]').type(userData.password);
    
    // 点击登录按钮
    cy.get('[data-cy="login-button"]').click();
    
    // 验证登录成功
    cy.url().should('not.include', '/login');
    cy.shouldHaveSuccessMessage('登录成功');
    
    // 验证用户信息显示
    cy.get('[data-cy="user-menu"]').should('be.visible');
    cy.get('[data-cy="user-name"]').should('contain', userData.email);
  });

  it('应该能够处理登录错误', () => {
    // 访问登录页面
    cy.visit('/login');
    
    // 输入错误的登录信息
    cy.get('[data-cy="email-input"]').type('wrong@example.com');
    cy.get('[data-cy="password-input"]').type('wrongpassword');
    
    // 点击登录按钮
    cy.get('[data-cy="login-button"]').click();
    
    // 验证错误消息
    cy.shouldHaveErrorMessage('用户名或密码错误');
  });

  it('应该能够验证登录表单', () => {
    // 访问登录页面
    cy.visit('/login');
    
    // 直接提交空表单
    cy.get('[data-cy="login-button"]').click();
    
    // 验证表单验证错误
    cy.shouldHaveFormError('[data-cy="email-field"]', '请输入邮箱地址');
    cy.shouldHaveFormError('[data-cy="password-field"]', '请输入密码');
    
    // 输入无效邮箱
    cy.get('[data-cy="email-input"]').type('invalid-email');
    cy.get('[data-cy="password-input"]').type('password123');
    cy.get('[data-cy="login-button"]').click();
    
    // 验证邮箱格式错误
    cy.shouldHaveFormError('[data-cy="email-field"]', '请输入有效的邮箱地址');
  });

  it('应该能够记住登录状态', () => {
    // 访问登录页面
    cy.visit('/login');
    
    // 输入登录信息并勾选记住我
    const userData = cy.getTestData().user;
    cy.get('[data-cy="email-input"]').type(userData.email);
    cy.get('[data-cy="password-input"]').type(userData.password);
    cy.get('[data-cy="remember-me"]').check();
    
    // 点击登录按钮
    cy.get('[data-cy="login-button"]').click();
    
    // 验证登录成功
    cy.url().should('not.include', '/login');
    
    // 刷新页面验证登录状态保持
    cy.reload();
    cy.get('[data-cy="user-menu"]').should('be.visible');
  });

  it('应该能够登出', () => {
    // 先登录
    cy.login();
    
    // 点击用户菜单
    cy.get('[data-cy="user-menu"]').click();
    
    // 点击登出按钮
    cy.get('[data-cy="logout-button"]').click();
    
    // 确认登出
    cy.confirmModal();
    
    // 验证登出成功
    cy.url().should('include', '/login');
    cy.shouldHaveSuccessMessage('登出成功');
  });

  it('应该能够处理会话过期', () => {
    // 模拟会话过期
    cy.login();
    
    // 清除localStorage模拟会话过期
    cy.clearLocalStorage();
    
    // 刷新页面
    cy.reload();
    
    // 验证跳转到登录页面
    cy.url().should('include', '/login');
    cy.shouldHaveErrorMessage('会话已过期，请重新登录');
  });

  it('应该能够注册新用户', () => {
    // 访问注册页面
    cy.visit('/register');
    
    // 验证页面元素
    cy.shouldHavePageTitle('用户注册');
    cy.get('[data-cy="email-input"]').should('be.visible');
    cy.get('[data-cy="password-input"]').should('be.visible');
    cy.get('[data-cy="confirm-password-input"]').should('be.visible');
    cy.get('[data-cy="register-button"]').should('be.visible');
    
    // 填写注册信息
    cy.fillForm({
      'email': 'newuser@example.com',
      'password': 'Password123!',
      'confirmPassword': 'Password123!',
      'name': '新用户',
    });
    
    // 点击注册按钮
    cy.get('[data-cy="register-button"]').click();
    
    // 验证注册成功
    cy.shouldHaveSuccessMessage('注册成功，请查收邮件进行验证');
  });

  it('应该能够重置密码', () => {
    // 访问忘记密码页面
    cy.visit('/forgot-password');
    
    // 验证页面元素
    cy.shouldHavePageTitle('忘记密码');
    cy.get('[data-cy="email-input"]').should('be.visible');
    cy.get('[data-cy="submit-button"]').should('be.visible');
    
    // 输入邮箱
    cy.get('[data-cy="email-input"]').type('user@example.com');
    
    // 点击提交按钮
    cy.get('[data-cy="submit-button"]').click();
    
    // 验证提交成功
    cy.shouldHaveSuccessMessage('重置密码邮件已发送');
  });

  it('应该能够验证用户权限', () => {
    // 使用普通用户登录
    cy.login('user@example.com', 'user123');
    
    // 尝试访问管理员页面
    cy.visit('/admin/users');
    
    // 验证权限不足
    cy.shouldHaveErrorMessage('权限不足');
    cy.url().should('not.include', '/admin/users');
  });

  it('应该能够管理用户个人资料', () => {
    // 登录
    cy.login();
    
    // 访问个人资料页面
    cy.visit('/profile');
    
    // 验证页面显示
    cy.shouldHavePageTitle('个人资料');
    
    // 修改个人资料
    cy.fillForm({
      'name': '修改后的用户名',
      'phone': '13800138000',
    });
    
    // 保存修改
    cy.get('[data-cy="save-button"]').click();
    
    // 验证修改成功
    cy.shouldHaveSuccessMessage('个人资料更新成功');
  });

  it('应该能够修改密码', () => {
    // 登录
    cy.login();
    
    // 访问修改密码页面
    cy.visit('/change-password');
    
    // 验证页面显示
    cy.shouldHavePageTitle('修改密码');
    
    // 填写密码修改表单
    cy.fillForm({
      'currentPassword': 'admin123',
      'newPassword': 'NewPassword123!',
      'confirmPassword': 'NewPassword123!',
    });
    
    // 提交修改
    cy.get('[data-cy="submit-button"]').click();
    
    // 验证修改成功
    cy.shouldHaveSuccessMessage('密码修改成功');
  });

  it('应该能够管理用户偏好设置', () => {
    // 登录
    cy.login();
    
    // 访问偏好设置页面
    cy.visit('/preferences');
    
    // 验证页面显示
    cy.shouldHavePageTitle('偏好设置');
    
    // 修改偏好设置
    cy.fillForm({
      'language': 'zh-CN',
      'theme': 'dark',
      'timezone': 'Asia/Shanghai',
    });
    
    // 保存设置
    cy.get('[data-cy="save-button"]').click();
    
    // 验证设置成功
    cy.shouldHaveSuccessMessage('偏好设置保存成功');
  });

  it('应该能够处理并发登录', () => {
    // 在第一个标签页登录
    cy.login();
    
    // 在第二个标签页尝试登录相同账户
    cy.window().then((win) => {
      win.open('/login', '_blank');
    });
    
    // 验证并发登录处理
    cy.shouldHaveErrorMessage('该账户已在其他地方登录');
  });

  it('应该能够验证邮箱', () => {
    // 访问邮箱验证页面
    cy.visit('/verify-email?token=test-token');
    
    // 验证验证结果
    cy.shouldHaveSuccessMessage('邮箱验证成功');
  });

  it('应该能够启用两步验证', () => {
    // 登录
    cy.login();
    
    // 访问安全设置页面
    cy.visit('/security');
    
    // 启用两步验证
    cy.get('[data-cy="enable-2fa"]').click();
    
    // 验证二维码显示
    cy.get('[data-cy="qr-code"]').should('be.visible');
    
    // 输入验证码
    cy.get('[data-cy="verification-code"]').type('123456');
    
    // 确认启用
    cy.get('[data-cy="confirm-button"]').click();
    
    // 验证启用成功
    cy.shouldHaveSuccessMessage('两步验证启用成功');
  });
});